﻿# 解决控制台中文乱码问题
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

# 获取脚本所在文件夹路径
$scriptDir = $PSScriptRoot

# 拼接Soft.ini文件完整路径
$iniPath = Join-Path -Path $scriptDir -ChildPath "Soft.ini"

# 检查文件是否存在
if (-not (Test-Path -Path $iniPath -PathType Leaf)) {
    Write-Error "未找到文件: $iniPath"
    exit 1
}

# 读取ANSI编码的文件内容
try {
    $iniContent = Get-Content -Path $iniPath -Encoding UTF8 -ErrorAction Stop
    $iniLines = $iniContent  # 保存原始行用于后续处理
}
catch {
    Write-Error "读取文件失败: $_"
    exit 1
}

# 初始化存储应用ID的数组
$idx = @()

# 跳过表头行，处理数据行提取应用ID
foreach ($line in $iniContent) {
    if ([string]::IsNullOrWhiteSpace($line) -or $line -match "^应用ID,") {
        continue
    }
    
    $id = $line -split ',', 2 | Select-Object -First 1
    
    if (-not [string]::IsNullOrWhiteSpace($id)) {
        $idx += $id
    }
}

Write-Host "提取到的应用ID数组："
$idx | ForEach-Object { Write-Host "- $_" }


# 定义输出文件路径
$outputFile = Join-Path -Path $scriptDir -ChildPath "soft.json"

# 执行winget export命令生成soft.json
try {
    Write-Host "正在导出软件列表到 $outputFile..."
    winget export -s winget -o $outputFile
    if (-not (Test-Path -Path $outputFile)) {
        throw "winget导出失败，未生成soft.json文件"
    }
}
catch {
    Write-Error "导出过程出错: $_"
    exit 1
}

# 解析soft.json文件并提取PackageIdentifier
try {
    Write-Host "正在解析soft.json文件..."
    $jsonContent = Get-Content -Path $outputFile -Raw | ConvertFrom-Json
    $idy = $jsonContent.Sources.Packages | Select-Object -ExpandProperty PackageIdentifier
    Write-Host "成功提取到 $($idy.Count) 个软件ID"
}
catch {
    Write-Error "解析过程出错: $_"
    exit 1
}

# 比较两个数组，取两边都有的元素生成已安装ID数组idz
Write-Host "`n比较两个数组，寻找共同的元素..."
$idz = Compare-Object -ReferenceObject $idx -DifferenceObject $idy -IncludeEqual -ExcludeDifferent | Select-Object -ExpandProperty InputObject

# 输出已安装ID结果
Write-Host "`n两个数组共有的元素有 $($idz.Count) 个："
$idz | ForEach-Object { Write-Host "- $_" }

# 获取可升级的包ID到idw数组
Write-Host "`n获取可升级的软件包ID..."
$idw = winget update --include-unknown --accept-source-agreements| 
    Where-Object { $_ -notmatch '^(名称|----|没有可用更新)' } |  # 排除标题行、分隔线和无更新提示
    ForEach-Object {
        if ($_ -match '\b[\w.]+\.[\w.]+\b') {  # 匹配PackageIdentifier格式（通常是publisher.appname）
            $matches[0]
        }
    }

# 输出可升级ID结果
Write-Host "`n获取到的可升级包ID列表（共 $($idw.Count) 个）："
$idw | ForEach-Object { Write-Host "- $_" }

# 检查是否有任何匹配项，如果没有则直接退出
if ($idz.Count -eq 0 -and $idw.Count -eq 0) {
    Write-Host "`n没有找到需要标记的应用ID，不需要修改Soft.ini文件。"
    exit 0
}

# 处理Soft.ini文件，添加已安装和可升级标识（标记到中文名称前面）
Write-Host "`n正在更新Soft.ini中的中文名称（添加标记）..."
$modifiedLines = @()
$modifiedCount = 0  # 记录修改的行数

foreach ($line in $iniLines) {
    # 处理空行
    if ([string]::IsNullOrWhiteSpace($line)) {
        $modifiedLines += $line
        continue
    }
    
    # 处理表头行
    if ($line -match "^应用ID,中文名称,用途,分类") {
        $modifiedLines += $line
        continue
    }
    
    # 分割行数据为4列（应用ID,中文名称,用途,分类）
    $columns = $line -split ',', 4  # 限制分割数为4，避免用途中的逗号导致列错乱
    $wasModified = $false  # 标记该行是否被修改
    
    # 检查是否有足够的列
    if ($columns.Count -eq 4) {
        $appId = $columns[0].Trim()
        $chineseName = $columns[1].Trim()  # 获取中文名称
        $originalName = $chineseName  # 保存原始名称用于清除旧标记
        
        # 先清除已有的标记，避免重复添加
        if ($chineseName -match '^\[(已安装√|可升级↑)\] ') {
            $chineseName = $chineseName -replace '^\[(已安装√|可升级↑)\] ', ''
        }
        
        # 标记逻辑：可升级优先于已安装
        if ($idw -contains $appId) {
            # 如果可升级，只添加可升级标记
            $columns[1] = "[可升级↑] $chineseName"
            $wasModified = $true
            Write-Host "已标记可升级应用: $appId"
        }
        elseif ($idz -contains $appId) {
            # 如果仅已安装，添加已安装标记
            $columns[1] = "[已安装√] $chineseName"
            $wasModified = $true
            Write-Host "已标记已安装应用: $appId"
        }
        # 如果都不满足，保持原样
        
        # 重新组合所有列
        $modifiedLine = $columns -join ','
        $modifiedLines += $modifiedLine
        
        # 统计修改行数
        if ($wasModified) {
            $modifiedCount++
        }
    }
    else {
        $modifiedLines += $line
        Write-Warning "跳过格式不正确的行: $line"
    }
}

# 如果没有任何修改，不执行写入操作
if ($modifiedCount -eq 0) {
    Write-Host "`n没有需要更新的记录，无需修改Soft.ini文件。"
    exit 0
}

# 将修改后的内容写回文件（创建备份后再写入）
$backupPath = $iniPath + ".bak"
try {
    # 备份原始文件
    if (Test-Path -Path $backupPath) {
        Remove-Item -Path $backupPath -Force -ErrorAction Stop
    }
    Copy-Item -Path $iniPath -Destination $backupPath -Force -ErrorAction Stop
    
    # 写入修改后的内容
    $modifiedLines | Out-File -FilePath $iniPath -Encoding UTF8 -Force -ErrorAction Stop
    Write-Host "`n已成功更新Soft.ini文件，原始文件备份为: $backupPath"
    Write-Host "共更新了 $modifiedCount 条记录"
}
catch {
    Write-Error "写入文件失败: $_"
    exit 1
}

Write-Host "`n处理完成"
